import Vue from "vue";
import App from "./App.vue";
import Router from "vue-router";
import RouterPath from "./routerPath.js";
var routerPath = new RouterPath();
Vue.use(Router);
Vue.config.productionTip = false; // Vue.config.silent = true; Vue.config.devtools = true;

// 初始化引擎
import api from "../api/api";
import logic from "./engineLogic";
api.init(logic);
import appCache from "./app.js";
import config from "./config";
import Request from "../request.js";
import Demand from "../demand.js";
api.request = new Request(config, appCache);
api.demand = new Demand(config);

import axios from "axios";
// 配置请求根路径
axios.defaults.baseURL = '/api';
// axios.interceptors.request.use(config => {
//     // console.log(config)
//     // config.headers.Authorization = window.sessionStorage.getItem('token')
//     config.headers.Authorization = 'Basic YWRtaW46cHVibGlj'
//     return config
// })
Vue.prototype.$axios = axios;//把axios挂载到vue上

window.onActivityResult = function(requestCode, key, value) {
    appCache.onActivityResult(requestCode, key, value);
};

// 注册组件
Vue.component("tt-router", () =>
    import ("@/api/component/tt-router.vue")); // 路由组件
// Vue.component("tt-input", () => import("@/api/component/tt-input.vue")); // 输入框
// Vue.component("tt-select", () => import("@/api/component/tt-select.vue")); // 选择框
// Vue.component("tt-select-check", () => import("@/api/component/tt-select-check.vue")); // 勾选框
// Vue.component("tt-button", () => import("@/api/component/tt-button.vue")); // 按钮
// Vue.component("tt-image", () => import("@/api/component/tt-image.vue")); // 图片
// Vue.component("tt-dialog", () =>
//     import ("@/api/component/tt-dialog.vue")); // 对话框
import component from "./component.js";
Vue.use(component);

import { Toast } from "vant";
Vue.use(Toast)
    // Vue.prototype.$toast = Toast;
var router = new Router({
    // mode: "history",
    // base: process.env.BASE_URL,
    routes: routerPath.getRouterArray()
});

router.onError(error => {
    if (error.message.match(/Loading chunk (\d)+ failed/g)) {
        router.replace(router.history.pending.fullPath);
    }
});

/** 导航守卫--全局前置钩子
 * to：route
 * from：route
 * next：Function  next() next(false) next({ path: '/' }) next(error)
 * 确保 next 函数在任何给定的导航守卫中都被严格调用一次。
 * 它可以出现多于一次，但是只能在所有的逻辑路径都不重叠的情况下，
 * 否则钩子永远都不会被解析或报错
 * router.beforeResolve类似beforeEach
 * beforeEnter--路由独享守卫，作用于单个路由，类似beforeEach
 */
// router.beforeEach((to, from, next) => {
//   //matched为router API
//   // let isNeedLogin = to.matched.some(res => {
//   //   return res.meta.requiresAuth;
//   // })
//   // if (isNeedLogin) {
//   //   next({
//   //     path: "/",
//   //     name: "Login",
//   //     component: () => import("../pages/login/login.vue"),
//   //     query: {
//   //       redirect: to.fullPath
//   //     }
//   //   })
//   // } else {
//   //   next() // 确保一定要调用 next()
//   // }
// })

/** 导航守卫--全局后置钩子
 * to：route
 * from：route
 * 不会改变导航本身
 */
// router.afterEach((to, from) => {
//   // ...
// })

/** 导航守卫--组件内的守卫
 * beforeRouteEnter(to, from, next)：在渲染该组件的对应路由被 confirm 前调用 | 不！能！获取组件实例 `this` | 当守卫执行前，组件实例还没被创建
 * beforeRouteUpdate(to, from, next)：在当前路由改变，但是该组件被复用时调用 | 可以访问组件实例 `this` | 不支持传递回调
 * beforeRouteLeave(to, from, next)：导航离开该组件的对应路由时调用 | 可以访问组件实例 `this`| 不支持传递回调 | 这个离开守卫通常用来禁止用户在还未保存修改前突然离开。该导航可以通过 next(false)
 * 和data()并级
 * 具体使用参考文档 或者百度
 */


/** 完整的导航解析流程 
 * 导航被触发。
 * 在失活的组件里调用 beforeRouteLeave 守卫。
 * 调用全局的 beforeEach 守卫。
 * 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
 * 在路由配置里调用 beforeEnter。
 * 解析异步路由组件。
 * 在被激活的组件里调用 beforeRouteEnter。
 * 调用全局的 beforeResolve 守卫 (2.5+)。
 * 导航被确认。
 * 调用全局的 afterEach 钩子。
 * 触发 DOM 更新。
 * 调用 beforeRouteEnter 守卫中传给 next 的回调函数，创建好的组件实例会作为回调函数的参数传入。*/











// 初始化Vue
new Vue({
    router: router,
    render: h => h(App),
    beforeCreate: function() {
        Vue.instance = this;
    }
}).$mount("#app");